<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>

                    <h4>数据类型和变量</h4>
                    <div class="x-wiki-info"><span>5796次阅读</span></div>
                    <hr style="border-top-color:#ccc" />
                    <div class="x-wiki-content x-content"><h3 id="-">数据类型</h3>
<p>计算机顾名思义就是可以做数学计算的机器，因此，计算机程序理所当然地可以处理各种数值。但是，计算机能处理的远不止数值，还可以处理文本、图形、音频、视频、网页等各种各样的数据，不同的数据，需要定义不同的数据类型。在Python中，能够直接处理的数据类型有以下几种：</p>
<h4 id="-">整数</h4>
<p>Python可以处理任意大小的整数，当然包括负整数，在程序中的表示方法和数学上的写法一模一样，例如：<code>1</code>，<code>100</code>，<code>-8080</code>，<code>0</code>，等等。</p>
<p>计算机由于使用二进制，所以，有时候用十六进制表示整数比较方便，十六进制用<code>0x</code>前缀和0-9，a-f表示，例如：<code>0xff00</code>，<code>0xa5b4c3d2</code>，等等。</p>
<h4 id="-">浮点数</h4>
<p>浮点数也就是小数，之所以称为浮点数，是因为按照科学记数法表示时，一个浮点数的小数点位置是可变的，比如，1.23x10<sup>9</sup>和12.3x10<sup>8</sup>是相等的。浮点数可以用数学写法，如<code>1.23</code>，<code>3.14</code>，<code>-9.01</code>，等等。但是对于很大或很小的浮点数，就必须用科学计数法表示，把10用e替代，1.23x10<sup>9</sup>就是<code>1.23e9</code>，或者<code>12.3e8</code>，0.000012可以写成<code>1.2e-5</code>，等等。</p>
<p>整数和浮点数在计算机内部存储的方式是不同的，整数运算永远是精确的（除法难道也是精确的？是的！），而浮点数运算则可能会有四舍五入的误差。</p>
<h4 id="-">字符串</h4>
<p>字符串是以&#39;&#39;或&quot;&quot;括起来的任意文本，比如<code>&#39;abc&#39;</code>，<code>&quot;xyz&quot;</code>等等。请注意，&#39;&#39;或&quot;&quot;本身只是一种表示方式，不是字符串的一部分，因此，字符串<code>&#39;abc&#39;</code>只有<code>a</code>，<code>b</code>，<code>c</code>这3个字符。如果<code>&#39;</code>本身也是一个字符，那就可以用&quot;&quot;括起来，比如<code>&quot;I&#39;m OK&quot;</code>包含的字符是<code>I</code>，<code>&#39;</code>，<code>m</code>，空格，<code>O</code>，<code>K</code>这6个字符。</p>
<p>如果字符串内部既包含<code>&#39;</code>又包含<code>&quot;</code>怎么办？可以用转义字符<code>\</code>来标识，比如：</p>
<pre><code>&#39;I\&#39;m \&quot;OK\&quot;!&#39;
</code></pre><p>表示的字符串内容是：</p>
<pre><code>I&#39;m &quot;OK&quot;!
</code></pre><p>转义字符<code>\</code>可以转义很多字符，比如<code>\n</code>表示换行，<code>\t</code>表示制表符，字符<code>\</code>本身也要转义，所以<code>\\</code>表示的字符就是<code>\</code>，可以在Python的交互式命令行用print打印字符串看看：</p>
<pre><code>&gt;&gt;&gt; print &#39;I\&#39;m ok.&#39;
I&#39;m ok.
&gt;&gt;&gt; print &#39;I\&#39;m learning\nPython.&#39;
I&#39;m learning
Python.
&gt;&gt;&gt; print &#39;\\\n\\&#39;
\
\
</code></pre><p>如果字符串里面有很多字符都需要转义，就需要加很多<code>\</code>，为了简化，Python还允许用<code>r&#39;&#39;</code>表示<code>&#39;&#39;</code>内部的字符串默认不转义，可以自己试试：</p>
<pre><code>&gt;&gt;&gt; print &#39;\\\t\\&#39;
\       \
&gt;&gt;&gt; print r&#39;\\\t\\&#39;
\\\t\\
</code></pre><p>如果字符串内部有很多换行，用<code>\n</code>写在一行里不好阅读，为了简化，Python允许用<code>&#39;&#39;&#39;...&#39;&#39;&#39;</code>的格式表示多行内容，可以自己试试：</p>
<pre><code>&gt;&gt;&gt; print &#39;&#39;&#39;line1
... line2
... line3&#39;&#39;&#39;
line1
line2
line3
</code></pre><p>上面是在交互式命令行内输入，如果写成程序，就是：</p>
<pre><code>print &#39;&#39;&#39;line1
line2
line3&#39;&#39;&#39;
</code></pre><p>多行字符串<code>&#39;&#39;&#39;...&#39;&#39;&#39;</code>还可以在前面加上<code>r</code>使用，请自行测试。</p>
<h4 id="-">布尔值</h4>
<p>布尔值和布尔代数的表示完全一致，一个布尔值只有<code>True</code>、<code>False</code>两种值，要么是<code>True</code>，要么是<code>False</code>，在Python中，可以直接用<code>True</code>、<code>False</code>表示布尔值（请注意大小写），也可以通过布尔运算计算出来：</p>
<pre><code>&gt;&gt;&gt; True
True
&gt;&gt;&gt; False
False
&gt;&gt;&gt; 3 &gt; 2
True
&gt;&gt;&gt; 3 &gt; 5
False
</code></pre><p>布尔值可以用<code>and</code>、<code>or</code>和<code>not</code>运算。</p>
<p><code>and</code>运算是与运算，只有所有都为<code>True</code>，<code>and</code>运算结果才是<code>True</code>：</p>
<pre><code>&gt;&gt;&gt; True and True
True
&gt;&gt;&gt; True and False
False
&gt;&gt;&gt; False and False
False
</code></pre><p><code>or</code>运算是或运算，只要其中有一个为<code>True</code>，<code>or</code>运算结果就是<code>True</code>：</p>
<pre><code>&gt;&gt;&gt; True or True
True
&gt;&gt;&gt; True or False
True
&gt;&gt;&gt; False or False
False
</code></pre><p><code>not</code>运算是非运算，它是一个单目运算符，把<code>True</code>变成<code>False</code>，<code>False</code>变成<code>True</code>：</p>
<pre><code>&gt;&gt;&gt; not True
False
&gt;&gt;&gt; not False
True
</code></pre><p>布尔值经常用在条件判断中，比如：</p>
<pre><code>if age &gt;= 18:
    print &#39;adult&#39;
else:
    print &#39;teenager&#39;
</code></pre><h4 id="-">空值</h4>
<p>空值是Python里一个特殊的值，用<code>None</code>表示。<code>None</code>不能理解为<code>0</code>，因为<code>0</code>是有意义的，而<code>None</code>是一个特殊的空值。</p>
<p>此外，Python还提供了列表、字典等多种数据类型，还允许创建自定义数据类型，我们后面会继续讲到。</p>
<h3 id="-">变量</h3>
<p>变量的概念基本上和初中代数的方程变量是一致的，只是在计算机程序中，变量不仅可以是数字，还可以是任意数据类型。</p>
<p>变量在程序中就是用一个变量名表示了，变量名必须是大小写英文、数字和<code>_</code>的组合，且不能用数字开头，比如：</p>
<pre><code>a = 1
</code></pre><p>变量<code>a</code>是一个整数。</p>
<pre><code>t_007 = &#39;T007&#39;
</code></pre><p>变量<code>t_007</code>是一个字符串。</p>
<pre><code>Answer = True
</code></pre><p>变量<code>Answer</code>是一个布尔值<code>True</code>。</p>
<p>在Python中，等号<code>=</code>是赋值语句，可以把任意数据类型赋值给变量，同一个变量可以反复赋值，而且可以是不同类型的变量，例如：</p>
<pre><code>a = 123 # a是整数
print a
a = &#39;ABC&#39; # a变为字符串
print a
</code></pre><p>这种变量本身类型不固定的语言称之为动态语言，与之对应的是静态语言。静态语言在定义变量时必须指定变量类型，如果赋值的时候类型不匹配，就会报错。例如Java是静态语言，赋值语句如下（// 表示注释）：</p>
<pre><code>int a = 123; // a是整数类型变量
a = &quot;ABC&quot;; // 错误：不能把字符串赋给整型变量
</code></pre><p>和静态语言相比，动态语言更灵活，就是这个原因。</p>
<p>请不要把赋值语句的等号等同于数学的等号。比如下面的代码：</p>
<pre><code>x = 10
x = x + 2
</code></pre><p>如果从数学上理解<code>x = x + 2</code>那无论如何是不成立的，在程序中，赋值语句先计算右侧的表达式<code>x + 2</code>，得到结果<code>12</code>，再赋给变量<code>x</code>。由于<code>x</code>之前的值是<code>10</code>，重新赋值后，<code>x</code>的值变成<code>12</code>。</p>
<p>最后，理解变量在计算机内存中的表示也非常重要。当我们写：</p>
<pre><code>a = &#39;ABC&#39;
</code></pre><p>时，Python解释器干了两件事情：</p>
<ol>
<li><p>在内存中创建了一个<code>&#39;ABC&#39;</code>的字符串；</p>
</li>
<li><p>在内存中创建了一个名为<code>a</code>的变量，并把它指向<code>&#39;ABC&#39;</code>。</p>
</li>
</ol>
<p>也可以把一个变量<code>a</code>赋值给另一个变量<code>b</code>，这个操作实际上是把变量<code>b</code>指向变量<code>a</code>所指向的数据，例如下面的代码：</p>
<pre><code>a = &#39;ABC&#39;
b = a
a = &#39;XYZ&#39;
print b
</code></pre><p>最后一行打印出变量<code>b</code>的内容到底是<code>&#39;ABC&#39;</code>呢还是<code>&#39;XYZ&#39;</code>？如果从数学意义上理解，就会错误地得出<code>b</code>和<code>a</code>相同，也应该是<code>&#39;XYZ&#39;</code>，但实际上<code>b</code>的值是<code>&#39;ABC&#39;</code>，让我们一行一行地执行代码，就可以看到到底发生了什么事：</p>
<p>执行<code>a = &#39;ABC&#39;</code>，解释器创建了字符串<code>&#39;ABC&#39;</code>和变量<code>a</code>，并把<code>a</code>指向<code>&#39;ABC&#39;</code>：</p>
<p><img src="http://www.liaoxuefeng.com/files/attachments/0013871830933164ebea9bff3e24a64a1d36c0a6c7d368f000/0" alt="py-var-code-1"></p>
<p>执行<code>b = a</code>，解释器创建了变量<code>b</code>，并把<code>b</code>指向<code>a</code>指向的字符串<code>&#39;ABC&#39;</code>：</p>
<p><img src="http://www.liaoxuefeng.com/files/attachments/0013871831797715367a9e297944ca88f362ea3b01efaf7000/0" alt="py-var-code-2"></p>
<p>执行<code>a = &#39;XYZ&#39;</code>，解释器创建了字符串&#39;XYZ&#39;，并把<code>a</code>的指向改为<code>&#39;XYZ&#39;</code>，但<code>b</code>并没有更改：</p>
<p><img src="http://www.liaoxuefeng.com/files/attachments/00138718324379052e7366c983442ac971699da163cacc7000/0" alt="py-var-code-3"></p>
<p>所以，最后打印变量<code>b</code>的结果自然是<code>&#39;ABC&#39;</code>了。</p>
<h3 id="-">常量</h3>
<p>所谓常量就是不能变的变量，比如常用的数学常数π就是一个常量。在Python中，通常用全部大写的变量名表示常量：</p>
<pre><code>PI = 3.14159265359
</code></pre><p>但事实上<code>PI</code>仍然是一个变量，Python根本没有任何机制保证<code>PI</code>不会被改变，所以，用全部大写的变量名表示常量只是一个习惯上的用法，如果你一定要改变变量<code>PI</code>的值，也没人能拦住你。</p>
<p>最后解释一下整数的除法为什么也是精确的，可以试试：</p>
<pre><code>&gt;&gt;&gt; 10 / 3
3
</code></pre><p>你没有看错，整数除法永远是整数，即使除不尽。要做精确的除法，只需把其中一个整数换成浮点数做除法就可以：</p>
<pre><code>&gt;&gt;&gt; 10.0 / 3
3.3333333333333335
</code></pre><p>因为整数除法只取结果的整数部分，所以Python还提供一个余数运算，可以得到两个整数相除的余数：</p>
<pre><code>&gt;&gt;&gt; 10 % 3
1
</code></pre><p>无论整数做除法还是取余数，结果永远是整数，所以，整数运算结果永远是精确的。</p>
<h3 id="-">小结</h3>
<p>Python支持多种数据类型，在计算机内部，可以把任何数据都看成一个“对象”，而变量就是在程序中用来指向这些数据对象的，对变量赋值就是把数据和变量给关联起来。</p>
</div>

                    <hr style="border-top-color:#ccc" />

                    